package com.example.examsystem.controller;

import com.example.examsystem.dto.PageResponse;
import com.example.examsystem.dto.RoleDto;
import com.example.examsystem.service.RoleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.util.List;

/**
 * 角色管理控制器
 * 提供角色的增删改查、权限分配等功能
 * 
 * @author system
 * @since 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/roles")
@RequiredArgsConstructor
public class RoleController {

    private final RoleService roleService;

    /**
     * 分页查询角色列表
     * 支持按角色名称、描述进行筛选
     * 
     * @param page 页码，从0开始
     * @param size 每页大小
     * @param name 角色名称（模糊查询）
     * @param description 角色描述（模糊查询）
     * @return 分页角色数据
     */
    @GetMapping
    @PreAuthorize("hasAuthority('system:role:view')")
    public ResponseEntity<PageResponse<RoleDto>> getRoles(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String description) {
        log.info("查询角色列表 - 页码: {}, 大小: {}, 名称: {}, 描述: {}", page, size, name, description);
        PageResponse<RoleDto> roles = roleService.getRoles(page, size, name, description);
        return ResponseEntity.ok(roles);
    }

    /**
     * 获取所有角色（不分页）
     * 通常用于下拉选择框等场景
     * 
     * @return 所有角色列表
     */
    @GetMapping("/all")
    @PreAuthorize("hasAuthority('system:role:view')")
    public ResponseEntity<List<RoleDto>> getAllRoles() {
        log.info("获取所有角色列表");
        List<RoleDto> roles = roleService.getAllRoles();
        return ResponseEntity.ok(roles);
    }

    /**
     * 根据ID获取单个角色详情
     * 
     * @param id 角色ID
     * @return 角色详情
     */
    @GetMapping("/{id}")
    @PreAuthorize("hasAuthority('system:role:view')")
    public ResponseEntity<RoleDto> getRole(@PathVariable Long id) {
        log.info("获取角色详情 - ID: {}", id);
        RoleDto role = roleService.getRoleById(id);
        return ResponseEntity.ok(role);
    }

    /**
     * 创建新角色
     * 
     * @param roleDto 角色信息
     * @return 创建的角色信息
     */
    @PostMapping
    @PreAuthorize("hasAuthority('system:role:create')")
    public ResponseEntity<RoleDto> createRole(@RequestBody @Valid RoleDto roleDto) {
        log.info("创建角色 - 名称: {}", roleDto.getName());
        RoleDto createdRole = roleService.createRole(roleDto);
        log.info("角色创建成功 - ID: {}", createdRole.getId());
        return ResponseEntity.ok(createdRole);
    }

    /**
     * 更新角色信息
     * 
     * @param id 角色ID
     * @param roleDto 更新的角色信息
     * @return 更新后的角色信息
     */
    @PutMapping("/{id}")
    @PreAuthorize("hasAuthority('system:role:update')")
    public ResponseEntity<RoleDto> updateRole(@PathVariable Long id, @RequestBody @Valid RoleDto roleDto) {
        log.info("更新角色 - ID: {}, 名称: {}", id, roleDto.getName());
        RoleDto updatedRole = roleService.updateRole(id, roleDto);
        log.info("角色更新成功 - ID: {}", id);
        return ResponseEntity.ok(updatedRole);
    }

    /**
     * 删除角色
     * 
     * @param id 角色ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @PreAuthorize("hasAuthority('system:role:delete')")
    public ResponseEntity<Void> deleteRole(@PathVariable Long id) {
        log.info("删除角色 - ID: {}", id);
        roleService.deleteRole(id);
        log.info("角色删除成功 - ID: {}", id);
        return ResponseEntity.ok().build();
    }

    /**
     * 为角色分配权限
     * 
     * @param id 角色ID
     * @param permissionIds 权限ID数组
     * @return 操作结果
     */
    @PutMapping("/{id}/permissions")
    @PreAuthorize("hasAuthority('system:role:permission')")
    public ResponseEntity<Void> assignPermissions(@PathVariable Long id, @RequestBody Long[] permissionIds) {
        log.info("为角色分配权限 - 角色ID: {}, 权限数量: {}", id, permissionIds != null ? permissionIds.length : 0);
        roleService.assignPermissions(id, permissionIds);
        log.info("角色权限分配成功 - 角色ID: {}", id);
        return ResponseEntity.ok().build();
    }

    /**
     * 获取角色的权限列表
     * 
     * @param id 角色ID
     * @return 权限ID列表
     */
    @GetMapping("/{id}/permissions")
    @PreAuthorize("hasAuthority('system:role:view')")
    public ResponseEntity<List<Long>> getRolePermissions(@PathVariable Long id) {
        log.info("获取角色权限列表 - 角色ID: {}", id);
        List<Long> permissionIds = roleService.getRolePermissions(id);
        return ResponseEntity.ok(permissionIds);
    }
}

